﻿package gear.log4a {
	/**
	 * 日志
	 * 
	 * @author bright
	 * @version 20101015
	 * @example
	 * <listing version="3.0"> Logger使用示例:
	 * Logger.addAppender(new TraceAppender());
	 * Logger.setLevel(Level.INFO);
	 * Logger.debug("this is a debug!");
	 * Logger.info("this is a info!");
	 * Logger.warn("this is a warn!");
	 * Logger.error("this is a error!");
	 * Logger.fatal("this is a fatal!");
	 * </listing> 
	 */
	public final class Logger {
		private static var _appenders : Array;
		private static var _level : Level = Level.ALL;
		private static var _creating : Boolean = false;

		/**
		 * @private
		 * @param level 日志层级
		 * @param message 消息数组
		 */
		private static function forcedLog(level : Level, message : Array) : void {
			if(level.compareTo(Logger._level)) {
				return;
			}
			Logger.callAppenders(new LoggingData(level, message));
		}

		private static function callAppenders(event : LoggingData) : void {
			for each(var appender:IAppender in Logger._appenders) {
				appender.append(event);
			}
		}

		/**
		 * Logger 日志
		 * 
		 * @throws Error 不能实例化
		 */
		public function Logger() {
			if(!Logger._creating) {
				throw(new Error(this, "Logger cannot be instantiated."));
			}
		}

		/**
		 * 设置输出层级
		 * 
		 * @param level 层级
		 */
		public static function setLevel(level : Level) : void {
			Logger._level = level;
		}

		/**
		 * 加入日志输出源
		 * 
		 * @param appender 日志输出源接口
		 */
		public static function addAppender(appender : IAppender) : void {
			if(Logger._appenders == null) {
				Logger._appenders = new Array();
			}
			if(Logger._appenders.indexOf(appender) == -1) {
				Logger._appenders.push(appender);
			}
		}

		/**
		 * 输出致命消息
		 * 
		 * @param message 消息数组
		 */
		public static function fatal(...message : Array) : void {
			Logger.forcedLog(Level.FATAL, message);
		}

		/**
		 * 输出错误消息
		 * 
		 * @param message 消息数组
		 */
		public static function error(...message : Array) : void {
			Logger.forcedLog(Level.ERROR, message);
		}

		/**
		 * 输出警告消息
		 * 
		 * @param message 消息数组
		 */
		public static function warn(...message : Array) : void {
			Logger.forcedLog(Level.WARN, message);
		}

		/**
		 * 输出信息消息
		 * 
		 * @param message 消息数组
		 */
		public static function info(...message : Array) : void {
			Logger.forcedLog(Level.INFO, message);
		}

		/**
		 * 输出调试消息
		 * 
		 * @param message 消息数组
		 */
		public static function debug(...message : Array) : void {
			Logger.forcedLog(Level.DEBUG, message);
		}
	}
}